import { Animal, Dog, Lion, Monkey, Tiger } from "./Animal";
import { IFireShow, IWisdonShow } from "./interface";

const animals: Animal[] = [
  new Lion('王富贵', 12),
  new Tiger('困困', 21),
  new Monkey('小六', 1),
  new Dog('旺财', 3),
  new Dog('狗剩', 5),
]

// 1. 所有动物打招呼
// animals.forEach(a=>a.say())

// 2. 所有会进行火圈表演的动物进行表演
animals.forEach(a => {
  // 将类型能力耦合在一起
  // 判断会不会火圈表演 变成了 判断是不是狮子老虎
  // if(a instanceof Lion || a instanceof Tiger){
  //   a.singFile()
  //   a.doublFile()
  // }

  // 先指定为未知 在指定为特定类型
  // if ((a as unknown as IFireShow).singFile && (a as unknown as IFireShow).doublFile) {}

  if (hasFireShow(a)) {
    a.singFile()
    a.doublFile()
  }
})
// 类型保护函数 判断 ani 是不是 IFireShow
function hasFireShow(ani: object): ani is IFireShow {
  // 判断 ani 里面有没有 singFile/doublFile 属性
  if ((ani as IFireShow).singFile && (ani as IFireShow).doublFile) {
    return true
  }
  return false
}

// 3. 所有会进行智慧表演的动物进行表演
animals.forEach(a => {
  if (hasIWisdonShow(a)) {
    a.suanshuiti()
    a.dance()
  }
})

function hasIWisdonShow(obj: object):obj is IWisdonShow{
  if((obj as IWisdonShow).suanshuiti && (obj as IWisdonShow).dance){
    return true
  }
  return false
}